/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.inve.view.mbean;

import com.brain.come.dto.DocumentoVentaDto;
import com.brain.come.dto.PedidoVentaDto;
import com.brain.come.mbean.DocumentoVentaMBean;
import com.brain.come.mbean.PedidoVentaMBean;
import com.brain.comp.dto.DocumentoCompraDto;
import com.brain.comp.dto.PedidoCompraDto;
import com.brain.comp.mbean.DocumentoCompraMBean;
import com.brain.comp.mbean.PedidoCompraMBean;
import com.brain.conf.dto.AlmacenDto;
import com.brain.conf.dto.AlmacenUbicacionDto;
import com.brain.conf.manager.AlmacenManager;
import com.brain.conf.manager.AlmacenUbicacionManager;
import com.brain.conf.manager.UnidadMedidaManager;
import com.brain.core.common.ExportarExcelInve;
import com.brain.core.common.UtilCore;
import com.brain.core.configuracion.WebServletContextListener;
import com.brain.core.dto.ParametroDto;
import com.brain.core.view.mbean.*;

import com.brain.core.exception.DAOException;
import com.brain.core.manager.BitacoraManager;
import com.brain.core.manager.OrganizacionManager;
import com.brain.core.manager.RecursosManager;
import com.brain.inve.dto.GuiaRemisionDetaDto;
import com.brain.inve.dto.GuiaRemisionDto;
import com.brain.inve.dto.GrDetaItemDto;
import com.brain.inve.manager.GrDetaItemManager;
import com.brain.inve.manager.GuiaRemisionDetaManager;
import com.brain.inve.manager.GuiaRemisionManager;
import com.brain.inve.view.util.ConstantesInve;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.annotation.Resource;
import javax.faces.model.SelectItem;
import org.apache.log4j.Logger;
import org.primefaces.context.RequestContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

/**
 *
 * @author Indra
 */
@Controller("guiaRemisionMBean")
@Scope("session")
public class GuiaRemisionMBean extends GenericMBean implements Serializable {

    private static Logger logger = Logger.getLogger(GuiaRemisionMBean.class);
    @Resource
    private GuiaRemisionManager manager;
    @Resource
    private OrganizacionManager organizacionManager;
    @Resource
    private SistemaControlInveMBean sistemaControlInveMBean;
    @Resource
    private BitacoraManager bitacoraManager;
    @Resource
    private GuiaRemisionDetaManager guiaRemisionDetaManager;
    @Resource
    private GrDetaItemManager grDetaItemManager;
    @Resource
    private ArchivoMBean archivoMBean;
    @Resource
    private RecursosManager recursosManager;
    @Resource
    private AlmacenUbicacionManager auManager;
    @Resource
    private UnidadMedidaManager umManager;
    @Autowired
    private ApplicationMBean applicationMBean;
    @Autowired
    private SessionMBean sessionMBean;
    private List<GuiaRemisionDto> lista;
    private GuiaRemisionDto dto;
    private GuiaRemisionDto dtoFiltro;
    private GuiaRemisionDetaDto detaDto;
    private String keyEntidad = "key.entidad.guia.remision";
    private String keyEntidadIntercambio = "key.entidad.intercambio";
    private String tituloDetalle;
    private SelectItem[] siEstadosFiltro;
    private SelectItem[] siTipos;
    private SelectItem[] siTiposFiltro;
    private Date fechaActual;
    private PedidoCompraDto dtoPC;
    private PedidoVentaDto dtoPV;
    private DocumentoCompraDto dtoDC;
    private DocumentoVentaDto dtoDV;
    private List<AlmacenDto> listaAlmacenes;
    private List<AlmacenUbicacionDto> listaAlmacenesUbicacionOrigen;
    private List<AlmacenUbicacionDto> listaAlmacenesUbicacionDestino;
    private List<ParametroDto> listaMotivosSinOrigen;
    private List<ParametroDto> listaMotivosConOrigen;
    private List<ParametroDto> listaMotivosTransfEntreAlm;
    private GrDetaItemDto grDetaItemDto;
    private GuiaRemisionDto infoGrDto;
    private GuiaRemisionDetaDto infoGrDetaDto;
    private Integer contIndex;
    private String urlInvocador;
    private boolean accesoAnulada;
    private boolean accesoConfirmada;
    private boolean accesoGuardar;
    private GuiaRemisionDto[] selectedGRs;
    private ExportarExcelInve.GuiaRemision grExcel;
    private String tipoXls;
    private Boolean checkExcel;

    public GuiaRemisionMBean() {
        this.dtoFiltro = new GuiaRemisionDto();
    }

    public String iniciar() {
        this.lista = null;
        this.dto = null;
        this.detaDto = null;
        this.dtoFiltro = new GuiaRemisionDto();
        this.dtoFiltro.setFlagGuiaFiltro("S");
        this.dtoFiltro.setTipo(ConstantesInve.ValoresConstantes.GUIA_REMISION_COD_TIPO_TODOS);
        this.dtoFiltro.setEstado(ConstantesInve.ValoresConstantes.GUIA_REMISION_COD_ESTADO_TODOS);
        this.dtoFiltro.setFechaInicio(UtilCore.Fecha.agregarDiasFechaDate(UtilCore.Fecha.obtenerFechaActualDate(), applicationMBean.getRangoFechasBusqueda() * -1));
        this.dtoFiltro.setFechaFin(UtilCore.Fecha.obtenerFechaActualDate());
        this.dtoFiltro.setFechaTrasladoInicio(UtilCore.Fecha.agregarDiasFechaDate(UtilCore.Fecha.obtenerFechaActualDate(), applicationMBean.getRangoFechasBusqueda() * -1));
        this.dtoFiltro.setFechaTrasladoFin(UtilCore.Fecha.obtenerFechaActualDate());
        this.grExcel = new ExportarExcelInve.GuiaRemision(true);
        this.selectedGRs = null;
        return manager.getUrlLista();
    }

    public String iniciarIntercambio() {
        this.lista = null;
        this.dto = null;
        this.detaDto = null;
        this.dtoFiltro = new GuiaRemisionDto();
        this.dtoFiltro.setEstado(ConstantesInve.ValoresConstantes.GUIA_REMISION_COD_ESTADO_TODOS);
        this.dtoFiltro.setFechaInicio(UtilCore.Fecha.agregarDiasFechaDate(UtilCore.Fecha.obtenerFechaActualDate(), applicationMBean.getRangoFechasBusqueda() * -1));
        this.dtoFiltro.setFechaFin(UtilCore.Fecha.obtenerFechaActualDate());
        this.dtoFiltro.setFechaTrasladoInicio(UtilCore.Fecha.agregarDiasFechaDate(UtilCore.Fecha.obtenerFechaActualDate(), applicationMBean.getRangoFechasBusqueda() * -1));
        this.dtoFiltro.setFechaTrasladoFin(UtilCore.Fecha.obtenerFechaActualDate());
        this.dtoFiltro.setTipo(ConstantesInve.ValoresConstantes.GUIA_REMISION_COD_TIPO_MOV);
        this.grExcel = new ExportarExcelInve.GuiaRemision(true);
        this.selectedGRs = null;
        return manager.getUrlListaIntercambio();
    }

    public String nuevoIngreso() {
        sessionMBean.setAccion(applicationMBean.getNuevo());
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyEntidad, sessionMBean.getAccion()));
        this.dto = manager.inicializarIngreso();
        this.dto.setFlagGuia(Boolean.FALSE);
        this.detaDto = this.guiaRemisionDetaManager.inicializar();
        this.urlInvocador = manager.getUrlLista();
        gestionAcceso();
        return manager.getUrlIngreso();
    }

    public String nuevaSalida() {
        sessionMBean.setAccion(applicationMBean.getNuevo());
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyEntidad, sessionMBean.getAccion()));
        this.dto = manager.inicializarSalida();
        this.dto.setFlagGuia(Boolean.TRUE);
        this.detaDto = this.guiaRemisionDetaManager.inicializar();
        this.urlInvocador = manager.getUrlLista();
        gestionAcceso();
        return manager.getUrlSalida();
    }

    public String nuevoIntercambio() {
        sessionMBean.setAccion(applicationMBean.getNuevo());
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyEntidadIntercambio, sessionMBean.getAccion()));
        this.dto = manager.inicializarIntercambio();
        manager.inicializarDtoIntercambio(dto);
        this.detaDto = this.guiaRemisionDetaManager.inicializar();
        this.urlInvocador = manager.getUrlLista();
        gestionAcceso();
        return manager.getUrlIntercambio();
    }

    public void nuevoDetalle() {
        RequestContext context = RequestContext.getCurrentInstance();
        boolean resultado = true;
        sessionMBean.setAccionDetalle(applicationMBean.getNuevo());
        this.detaDto = this.guiaRemisionDetaManager.inicializar();
        this.detaDto.setGuiaRemisionDto(dto);
        //Obtenemos el Item del detalle
        if (!dto.getListaDetalles().isEmpty()) {
            detaDto.setItem(dto.getListaDetalles().size() + 1);
        } else {
            detaDto.setItem(1);
        }
        this.grDetaItemDto = grDetaItemManager.inicializar();
        resultado = obtenerAlmacenesUbicacionPorTipoGuia();
        if (dto.getTipo() == ConstantesInve.ValoresConstantes.GUIA_REMISION_COD_TIPO_MOV) {
            if (dto.getAlmacenDestinoDto().equals(dto.getAlmacenOrigenDto())) {
                recursosManager.showError(UtilCore.Internacionalizacion.getMensajeInternacional("guia.remision.mensaje.20"));
                resultado = false;
            }
        }
        context.addCallbackParam("CallbackParam", resultado);
    }

    public String editar() {
        String url = "";
        sessionMBean.setAccion(applicationMBean.getEditar());
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyEntidad, sessionMBean.getAccion()));
        this.detaDto = this.guiaRemisionDetaManager.inicializar();
        this.urlInvocador = manager.getUrlLista();
        try {
            this.dto = manager.obtenerPorId(this.dto.getId());
        } catch (DAOException ex) {
            showError(ex.getMessage());
            logger.error(ex);
        }
        gestionAcceso();
        if (dto.getTipo() == ConstantesInve.ValoresConstantes.GUIA_REMISION_COD_TIPO_ING) {
            url = manager.getUrlIngreso();
        } else if (dto.getTipo() == ConstantesInve.ValoresConstantes.GUIA_REMISION_COD_TIPO_SAL) {
            url = manager.getUrlSalida();
        }
        return url;
    }
    
    public String editarAjax() {
        String url = "";
        sessionMBean.setAccion(applicationMBean.getEditar());
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyEntidad, sessionMBean.getAccion()));
        this.detaDto = this.guiaRemisionDetaManager.inicializar();
        this.urlInvocador = manager.getUrlLista();
        try {
            this.dto = manager.obtenerPorId(this.dto.getId());
        } catch (DAOException ex) {
            showError(ex.getMessage());
            logger.error(ex);
        }
        gestionAcceso();
        if (dto.getTipo() == ConstantesInve.ValoresConstantes.GUIA_REMISION_COD_TIPO_ING) {
            url = manager.getUrlIngreso();
        } else if (dto.getTipo() == ConstantesInve.ValoresConstantes.GUIA_REMISION_COD_TIPO_SAL) {
            url = manager.getUrlSalida();
        }
        return url + "?faces-redirect=true";
    }

    public String editarIntercambio() {
        sessionMBean.setAccion(applicationMBean.getEditar());
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyEntidadIntercambio, sessionMBean.getAccion()));
        this.detaDto = this.guiaRemisionDetaManager.inicializar();
        this.urlInvocador = manager.getUrlLista();
        try {
            this.dto = manager.obtenerPorId(this.dto.getId());
        } catch (DAOException ex) {
            showError(ex.getMessage());
            logger.error(ex);
        }
        gestionAcceso();
        return manager.getUrlIntercambio();
    }

    public void editarDetalle() {
        RequestContext context = RequestContext.getCurrentInstance();
        boolean resultado = true;
        sessionMBean.setAccionDetalle(applicationMBean.getEditar());
        this.detaDto = dto.getListaDetalles().get(contIndex);
        if (this.detaDto.getId() != null) {
            try {
                this.detaDto = guiaRemisionDetaManager.obtenerPorId(this.detaDto.getId());
                this.detaDto.setIsSave(Boolean.TRUE);
            } catch (DAOException ex) {
                showError(ex.getMessage());
                logger.error(ex);
            }
        }
        this.detaDto.setIsSave(Boolean.TRUE);
        this.grDetaItemDto = grDetaItemManager.inicializar();
        resultado = obtenerAlmacenesUbicacionPorTipoGuia();
        context.addCallbackParam("CallbackParam", resultado);
    }

    public String ver() {
        String url = "";
        sessionMBean.setAccion(applicationMBean.getVer());
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyEntidad, sessionMBean.getAccion()));
        this.detaDto = this.guiaRemisionDetaManager.inicializar();
        this.urlInvocador = manager.getUrlLista();
        try {
            this.dto = manager.obtenerPorId(this.dto.getId());
        } catch (DAOException ex) {
            showError(ex.getMessage());
            logger.error(ex);
        }
        gestionAcceso();
        if (dto.getTipo() == ConstantesInve.ValoresConstantes.GUIA_REMISION_COD_TIPO_ING) {
            url = manager.getUrlIngreso();
        } else if (dto.getTipo() == ConstantesInve.ValoresConstantes.GUIA_REMISION_COD_TIPO_SAL) {
            url = manager.getUrlSalida();
        }
        return url;
    }

    public String verIntercambio() {
        sessionMBean.setAccion(applicationMBean.getVer());
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyEntidadIntercambio, sessionMBean.getAccion()));
        this.detaDto = this.guiaRemisionDetaManager.inicializar();
        this.urlInvocador = manager.getUrlLista();
        try {
            this.dto = manager.obtenerPorId(this.dto.getId());
        } catch (DAOException ex) {
            showError(ex.getMessage());
            logger.error(ex);
        }
        gestionAcceso();
        return manager.getUrlIntercambio();
    }

    public void verDetalle() {
        sessionMBean.setAccionDetalle(applicationMBean.getVer());
        if (this.detaDto.getId() != null) {
            try {
                this.detaDto = guiaRemisionDetaManager.obtenerPorId(this.detaDto.getId());
                this.detaDto.setIsSave(Boolean.TRUE);
            } catch (DAOException ex) {
                showError(ex.getMessage());
                logger.error(ex);
            }
        }
        obtenerAlmacenesUbicacionPorTipoGuia();
    }

    public void verDetalleInfo() {
        try {
            this.infoGrDto = manager.obtenerPorId(this.infoGrDto.getId());
        } catch (DAOException ex) {
            showError(ex.getMessage());
            logger.error(ex);
        }
    }

    public void verDetalleInfoMovimiento() {
        try {
            this.infoGrDetaDto = guiaRemisionDetaManager.obtenerPorId(this.infoGrDetaDto.getId());
        } catch (DAOException ex) {
            showError(ex.getMessage());
            logger.error(ex);
        }
    }

    public void verInfo(Long id) {
        try {
            this.infoGrDto = manager.obtenerPorId(id);
        } catch (DAOException ex) {
            showError(ex.getMessage());
            logger.error(ex);
        }
    }

    public void buscar() {
        try {
            List<GuiaRemisionDto> l = new ArrayList<GuiaRemisionDto>();
            this.lista = this.manager.obtener(this.dtoFiltro);
            if (!this.lista.isEmpty()) {
                for (GuiaRemisionDto x: this.lista) {
                    x.setUltimaModificacion(this.manager.obtenerCadenaUltimaModificacionLista(x));
                    l.add(x);
                }
                this.lista = l;
            }
        } catch (DAOException ex) {
            showError(ex.getMessage());
            logger.error(ex);
        }
    }

    public void buscarIntercambio() {
        try {
            this.lista = this.manager.obtenerIntercambios(this.dtoFiltro);
        } catch (DAOException ex) {
            showError(ex.getMessage());
            logger.error(ex);
        }
    }

    public String guardar() {
        if (manager.guardar(this.dto) != null) {
            this.editar();
        }
        return null;
    }

    public void guardarDetalle() {
        RequestContext context = RequestContext.getCurrentInstance();
        boolean resultado = true;
        try {
            if (manager.verificarAlmacenUbicacionPorDetalle(dto, detaDto)) {
                if (manager.validarCantidadAtendida(dto, detaDto)) {
                    if (this.dto.getId() != null) {
                        if (guiaRemisionDetaManager.guardar(detaDto) != null) {
                            //Actualizamos la fecha de la ultima modificacion realizada
                            this.dto.setFecha(UtilCore.Fecha.obtenerFechaActualDate());
                            this.manager.guardar(this.dto);
                            //-------------------------------------------------------------------------
                            this.dto = this.manager.obtenerPorId(this.dto.getId());
                        }
                    } else {
                        if (sessionMBean.getAccionDetalle() == applicationMBean.getNuevo()) {
                            this.dto.getListaDetalles().add(this.detaDto);
                        }
                    }
                    if (this.dto.getId() != null) {
                        this.manager.editar(dto);
                    }
                } else {
                    resultado = false;
                }
            } else {
                resultado = false;
            }
        } catch (DAOException ex) {
            showError(ex.getMessage());
            logger.error(ex);
        }
        context.addCallbackParam("CallbackParam", resultado);
    }

    public void eliminarDetalle() {
        try {
            if (manager.verificarEliminarDetalle(dto)) {
                detaDto = this.dto.getListaDetalles().get(contIndex.intValue());
                if (detaDto.getId() != null) {
                    guiaRemisionDetaManager.eliminar(detaDto);
                    //Actualizando la fecha de ultima modificacion en el registro
                    this.dto.setFecha(UtilCore.Fecha.obtenerFechaActualDate());
                    this.manager.guardar(this.dto);
                    //----------------------------------------------------------------------
                    this.dto = this.manager.obtenerPorId(this.dto.getId());
                } else {
                    this.dto.getListaDetalles().remove(contIndex.intValue());
                }
                this.manager.reordenarDetalles(dto);
            }
        } catch (DAOException ex) {
            showError(ex.getMessage());
            logger.error(ex);
        }
    }

    public void cambioDeAlmacen(String tipo) {
        try {
            GrDetaItemManager grDetaItemManager = (GrDetaItemManager) WebServletContextListener.getApplicationContext().getBean("grDetaItemManager");
            if (tipo.equals("O")) {
                dto.setDireccionAlmacenOrigen(dto.getAlmacenOrigenDto().getDireccion());
                dto.setDireccionRemitente(dto.getAlmacenOrigenDto().getDireccion());
            } else if (tipo.equals("D")) {
                dto.setDireccionAlmacenDestino(dto.getAlmacenDestinoDto().getDireccion());
                dto.setDireccionDestinatario(dto.getAlmacenDestinoDto().getDireccion());
            }
            if (dto.getListaDetalles() != null) {
                if (!dto.getListaDetalles().isEmpty()) {
                    for (GuiaRemisionDetaDto hijo : dto.getListaDetalles()) {
                        if (hijo.getId() != null) {
                            grDetaItemManager.eliminarMuchos(hijo.getListaDetalles());
                        }
                        hijo.setListaDetalles(new ArrayList<GrDetaItemDto>());
                    }
                    recursosManager.showWarning(UtilCore.Internacionalizacion.getMensajeInternacional("guia.remision.mensaje.8"));
                }
            }
        } catch (DAOException ex) {
            showError(ex.getMessage());
            logger.error(ex);
        }
    }

    public void handleProductoChange() {
        this.detaDto.setUnidadMedidaDto(detaDto.getProductoDetaDto().getUnidadMedidaDto());
    }

    public String verBitacora() {

        bitacoraManager.cargarBitacoraEntidad(manager.getIdEntidad(), this.dto.getId());
        return null;
    }

    public String verBitacoraDetalle() {
        bitacoraManager.cargarBitacoraEntidad(guiaRemisionDetaManager.getIdEntidad(), this.detaDto.getId());
        return null;
    }

    public String verArchivos() {
        sessionMBean.setEntidad(manager.getIdEntidad());
        sessionMBean.setRegistro(this.dto.getId());
        archivoMBean.cargarArchivos();

        return null;
    }

    public void confirmar() {
        dto.setFechaConfirmacion(UtilCore.Fecha.obtenerFechaActualDate());
        dto.setUsuarioConfirmacionDto(sessionMBean.getSessionUsuarioDto());
        dto.setEstado(ConstantesInve.ValoresConstantes.GUIA_REMISION_COD_ESTADO_CONFIRMADO);
        guardar();
    }

    public void anular() {
        dto.setFechaAnulacion(UtilCore.Fecha.obtenerFechaActualDate());
        dto.setUsuarioAnulacionDto(sessionMBean.getSessionUsuarioDto());
        dto.setEstado(ConstantesInve.ValoresConstantes.GUIA_REMISION_COD_ESTADO_ANULADO);
        guardar();
    }

    public String cargarPopupConfirmarInter() {
        RequestContext context = RequestContext.getCurrentInstance();
        boolean resultado = true;
        try {
            dto.setEstado(ConstantesInve.ValoresConstantes.GUIA_REMISION_COD_ESTADO_CONFIRMADO);
            sistemaControlInveMBean.cargarEncargadosParaPopup(ConstantesInve.ValoresConstantes.SIST_CONTROL_COD_TRANSAC_INTERALM, ConstantesInve.ValoresConstantes.GUIA_REMISION_COD_ESTADO_CONFIRMADO, dto.getId());
            if (sistemaControlInveMBean.getListaDetallesPopup() == null) {
                resultado = false;
            } else if (sistemaControlInveMBean.getListaDetallesPopup().isEmpty()) {
                resultado = false;
                confirmar();
                return manager.getUrlIntercambio() + "?faces-redirect=true";
            }
        } catch (Exception ex) {
            showError(ex.getMessage());
            logger.error(ex);
        }

        context.addCallbackParam("CallbackParam", resultado);
        return null;
    }
    
    public String cargarPopupAnularInter() {
        RequestContext context = RequestContext.getCurrentInstance();
        boolean resultado = true;
        try {
            sistemaControlInveMBean.cargarEncargadosParaPopup(ConstantesInve.ValoresConstantes.SIST_CONTROL_COD_TRANSAC_INTERALM, ConstantesInve.ValoresConstantes.GUIA_REMISION_COD_ESTADO_ANULADO, dto.getId());
            if (sistemaControlInveMBean.getListaDetallesPopup() == null) {
                resultado = false;
            } else if (sistemaControlInveMBean.getListaDetallesPopup().isEmpty()) {
                resultado = false;
                anular();
                return manager.getUrlIntercambio() + "?faces-redirect=true";
            }
        } catch (Exception ex) {
            showError(ex.getMessage());
            logger.error(ex);
        }

        context.addCallbackParam("CallbackParam", resultado);
        return null;
    }
    
    public String cargarPopupConfirmar() {
        RequestContext context = RequestContext.getCurrentInstance();
        boolean resultado = true;
        try {
            dto.setEstado(ConstantesInve.ValoresConstantes.GUIA_REMISION_COD_ESTADO_CONFIRMADO);
            sistemaControlInveMBean.cargarEncargadosParaPopup(ConstantesInve.ValoresConstantes.SIST_CONTROL_COD_TRANSAC_MOVIMIENTO, ConstantesInve.ValoresConstantes.GUIA_REMISION_COD_ESTADO_CONFIRMADO, dto.getId());
            if (sistemaControlInveMBean.getListaDetallesPopup() == null) {
                resultado = false;
            } else if (sistemaControlInveMBean.getListaDetallesPopup().isEmpty()) {
                resultado = false;
                confirmar();
                return editarAjax();
            }
        } catch (Exception ex) {
            showError(ex.getMessage());
            logger.error(ex);
        }

        context.addCallbackParam("CallbackParam", resultado);
        return null;
    }
    
    public String cargarPopupAnular() {
        RequestContext context = RequestContext.getCurrentInstance();
        boolean resultado = true;
        try {
            sistemaControlInveMBean.cargarEncargadosParaPopup(ConstantesInve.ValoresConstantes.SIST_CONTROL_COD_TRANSAC_MOVIMIENTO, ConstantesInve.ValoresConstantes.GUIA_REMISION_COD_ESTADO_ANULADO, dto.getId());
            if (sistemaControlInveMBean.getListaDetallesPopup() == null) {
                resultado = false;
            } else if (sistemaControlInveMBean.getListaDetallesPopup().isEmpty()) {
                resultado = false;
                anular();
                return editarAjax();
            }
        } catch (Exception ex) {
            showError(ex.getMessage());
            logger.error(ex);
        }

        context.addCallbackParam("CallbackParam", resultado);
        return null;
    }
    
    public void gestionAcceso() {
        this.accesoAnulada = false;
        this.accesoConfirmada = true;
        this.accesoGuardar = true;
        if (dto.getId() != null) {
            if (dto.getEstado().equals(ConstantesInve.ValoresConstantes.GUIA_REMISION_COD_ESTADO_ELABORACION)) {//Elaborazion
                this.accesoAnulada = true;
                this.accesoConfirmada = true;
                this.accesoGuardar = true;
            } else if (dto.getEstado().equals(ConstantesInve.ValoresConstantes.GUIA_REMISION_COD_ESTADO_ANULADO)) {
                this.accesoAnulada = false;
                this.accesoConfirmada = false;
                this.accesoGuardar = false;
            } else if (dto.getEstado().equals(ConstantesInve.ValoresConstantes.GUIA_REMISION_COD_ESTADO_CONFIRMADO)) {
                this.accesoAnulada = true;
                this.accesoConfirmada = false;
                this.accesoGuardar = false;
            }

            //Si la accion es = VER
            if (sessionMBean.getAccion() == applicationMBean.getVer()) {
                this.accesoAnulada = false;
                this.accesoConfirmada = false;
                this.accesoGuardar = false;
            }
        } else {
            this.accesoConfirmada = false;
        }
    }

    public String cargarFormManual() {
        String retorno = "";
        this.dto = manager.cargarFormManual(dto);
        if (dto.getTipo() == ConstantesInve.ValoresConstantes.GUIA_REMISION_COD_TIPO_ING) {
            retorno = manager.getUrlIngreso();
        } else if (dto.getTipo() == ConstantesInve.ValoresConstantes.GUIA_REMISION_COD_TIPO_SAL) {
            retorno = manager.getUrlSalida();
        }
        return retorno;
    }

    public void cargarPopupPedidoCompra() {
        PedidoCompraMBean pedidoCompraMBean = (PedidoCompraMBean) WebServletContextListener.getApplicationContext().getBean("pedidoCompraMBean");
        pedidoCompraMBean.iniciarPopup();
        this.dtoPC = new PedidoCompraDto();
    }

    public void cargarPopupPedidoVenta() {
        PedidoVentaMBean pedidoVentaMBean = (PedidoVentaMBean) WebServletContextListener.getApplicationContext().getBean("pedidoVentaMBean");
        pedidoVentaMBean.iniciarPopup();
        this.dtoPV = new PedidoVentaDto();
    }

    public void cargarPopupDocumentoCompra() {
        DocumentoCompraMBean documentoCompraMBean = (DocumentoCompraMBean) WebServletContextListener.getApplicationContext().getBean("documentoCompraMBean");
        documentoCompraMBean.iniciarPopup();
        this.dtoDC = new DocumentoCompraDto();
    }

    public void cargarPopupDocumentoVenta() {
        DocumentoVentaMBean documentoVentaMBean = (DocumentoVentaMBean) WebServletContextListener.getApplicationContext().getBean("documentoVentaMBean");
        documentoVentaMBean.iniciarPopup();
        this.dtoDV = new DocumentoVentaDto();
    }

    public void seleccionaPedidoCompra() {
        RequestContext context = RequestContext.getCurrentInstance();
        Boolean resultado = true;
        if (this.dtoPC != null) {
            resultado = this.manager.seleccionaPedidoCompra(this.dto, this.dtoPC);
        }
        context.addCallbackParam("CallbackParam", resultado);
    }

    public void seleccionaPedidoVenta() {
        RequestContext context = RequestContext.getCurrentInstance();
        Boolean resultado = true;
        if (this.dtoPV != null) {
            resultado = this.manager.seleccionaPedidoVenta(this.dto, this.dtoPV);
        }
        context.addCallbackParam("CallbackParam", resultado);
    }

    public void seleccionaDocumentoCompra() {
        RequestContext context = RequestContext.getCurrentInstance();
        Boolean resultado = true;
        if (this.dtoDC != null) {
            resultado = this.manager.seleccionaDocumentoCompra(this.dto, this.dtoDC);
        }
        context.addCallbackParam("CallbackParam", resultado);
    }

    public void seleccionaDocumentoVenta() {
        RequestContext context = RequestContext.getCurrentInstance();
        Boolean resultado = true;
        if (this.dtoDV != null) {
            resultado = this.manager.seleccionaDocumentoVenta(this.dto, this.dtoDV);
        }
        context.addCallbackParam("CallbackParam", resultado);
    }

    public void eliminarGrDetaItem() {
        this.detaDto.getListaDetalles().remove(contIndex.intValue());
    }

    public void agregarGrDetaItem() {
        if (manager.validarDatosGrDetaItem(grDetaItemDto)) {
            manager.agregarGrDetaItem(dto, detaDto, grDetaItemDto);
            grDetaItemDto = grDetaItemManager.inicializar();
        }
        
        for(GrDetaItemDto t : detaDto.getListaDetalles()){
            System.out.println("CANTIDAD --> " + t.getCantidadMovida());
        }
    }

    public void editarGrDetaItem(Integer contIndex) {
        manager.editarGrDetaItem(dto, detaDto, contIndex.intValue());
    }

    private Boolean obtenerAlmacenesUbicacionPorTipoGuia() {
        boolean resultado = true;
        try {
            //Obtenemos los almacenes ubicacion por tipo de guia de remision
            if (dto.getTipo() == ConstantesInve.ValoresConstantes.GUIA_REMISION_COD_TIPO_ING) {
                if (dto.getAlmacenDestinoDto() != null) {
                    this.listaAlmacenesUbicacionDestino = auManager.obtenerActivosPorAlmacen(dto.getAlmacenDestinoDto());
                } else {
                    showMessage(UtilCore.Internacionalizacion.getMensajeInternacional("guia.remision.mensaje.9"));
                    resultado = false;
                }
            } else if (dto.getTipo() == ConstantesInve.ValoresConstantes.GUIA_REMISION_COD_TIPO_SAL) {
                if (dto.getAlmacenOrigenDto() != null) {
                    this.listaAlmacenesUbicacionOrigen = auManager.obtenerActivosPorAlmacen(dto.getAlmacenOrigenDto());
                } else {
                    showMessage(UtilCore.Internacionalizacion.getMensajeInternacional("guia.remision.mensaje.10"));
                    resultado = false;
                }
            } else if (dto.getTipo() == ConstantesInve.ValoresConstantes.GUIA_REMISION_COD_TIPO_MOV) {
                if (dto.getAlmacenDestinoDto() != null && dto.getAlmacenOrigenDto() != null) {
                    this.listaAlmacenesUbicacionDestino = auManager.obtenerActivosPorAlmacen(dto.getAlmacenDestinoDto());
                    this.listaAlmacenesUbicacionOrigen = auManager.obtenerActivosPorAlmacen(dto.getAlmacenOrigenDto());
                } else {
                    showMessage(UtilCore.Internacionalizacion.getMensajeInternacional("guia.remision.mensaje.11"));
                    resultado = false;
                }
            }
        } catch (DAOException ex) {
            showError(ex.getMessage());
            logger.error(ex);
        }
        return resultado;
    }

    public void visualizarOrigenPC() {
        RequestContext context = RequestContext.getCurrentInstance();
        int resultado = 0;
        if (this.dto.getProviene().equals(ConstantesInve.ValoresConstantes.GUIA_REMISION_COD_PROVIENE_PC)) {
            PedidoCompraMBean pedidoCompraMBean = (PedidoCompraMBean) WebServletContextListener.getApplicationContext().getBean("pedidoCompraMBean");
            pedidoCompraMBean.cargarDatosInfo(dto.getPedidoCompraDto().getId());
            resultado = 1;
        }
        context.addCallbackParam("CallbackParam", resultado);
    }

    public void visualizarOrigenPV() {
        RequestContext context = RequestContext.getCurrentInstance();
        int resultado = 0;
        if (this.dto.getProviene().equals(ConstantesInve.ValoresConstantes.GUIA_REMISION_COD_PROVIENE_PV)) {
            PedidoVentaMBean pedidoVentaMBean = (PedidoVentaMBean) WebServletContextListener.getApplicationContext().getBean("pedidoVentaMBean");
            pedidoVentaMBean.cargarDatosInfo(dto.getPedidoVentaDto().getId());
            resultado = 2;
        }
        context.addCallbackParam("CallbackParam", resultado);
    }

    public void visualizarOrigenDC() {
        RequestContext context = RequestContext.getCurrentInstance();
        int resultado = 0;
        if (this.dto.getProviene().equals(ConstantesInve.ValoresConstantes.GUIA_REMISION_COD_PROVIENE_DC)) {
            DocumentoCompraMBean documentoCompraMBean = (DocumentoCompraMBean) WebServletContextListener.getApplicationContext().getBean("documentoCompraMBean");
            documentoCompraMBean.cargarDatosInfo(dto.getDocumentoCompraDto().getId());
            resultado = 3;
        }
        context.addCallbackParam("CallbackParam", resultado);
    }

    public void visualizarOrigenDV() {
        RequestContext context = RequestContext.getCurrentInstance();
        int resultado = 0;
        if (this.dto.getProviene().equals(ConstantesInve.ValoresConstantes.GUIA_REMISION_COD_PROVIENE_DV)) {
            DocumentoVentaMBean documentoVentaMBean = (DocumentoVentaMBean) WebServletContextListener.getApplicationContext().getBean("documentoVentaMBean");
            documentoVentaMBean.cargarDatosInfo(dto.getDocumentoVentaDto().getId());
            resultado = 4;
        }
        context.addCallbackParam("CallbackParam", resultado);
    }

    public String retroceder() {
        buscar();
        return this.urlInvocador;
    }

    public String retrocederIntercamvbio() {
        buscarIntercambio();
        return manager.getUrlListaIntercambio();
    }

    private void generarExcelSeleccionadosGuiaRemision() {
        this.manager.generarExcelSeleccionados(grExcel, selectedGRs);
    }

    private void generarExcelPorTablaGuiaRemision() {
        this.manager.generarExcelPorTabla(grExcel, lista);
    }

    public void exportarExcel() {
        if (this.tipoXls.equals("T")) {
            generarExcelPorTablaGuiaRemision();
        } else if (this.tipoXls.equals("S")) {
            generarExcelSeleccionadosGuiaRemision();
        }
    }

    public void cargarPopupExportarExcel(String tipo) {
        RequestContext context = RequestContext.getCurrentInstance();
        boolean resultado = true;
        this.tipoXls = tipo;
        if (tipo.equals("T")) {
            if (lista.isEmpty()) {
                resultado = false;
                this.recursosManager.showWarning(UtilCore.Internacionalizacion.getMensajeInternacional("mensaje.selecc.guia.remision"));
            }
        } else if (tipo.equals("S")) {
            if (selectedGRs.length <= 0) {
                resultado = false;
                this.recursosManager.showWarning(UtilCore.Internacionalizacion.getMensajeInternacional("mensaje.selecc.guia.remision"));
            }
        }
        if (resultado) {
            this.grExcel = new ExportarExcelInve.GuiaRemision(true);
            this.checkExcel = Boolean.TRUE;
        }
        context.addCallbackParam("CallbackParam", resultado);
    }

    public void onChangeChekExcel() {
        this.grExcel = manager.onChangeChekExcel(checkExcel);
    }

    public String imprimirDto() {
        this.manager.imprimirDto(dto);
        return "";
    }
    
    public String imprimirMovimientoDto() {
        this.manager.imprimirMovimientoDto(dto);
        return "";
    }
    
    public void prueba(){
        System.out.println("FLAG --> " + dto.getFlagGuia());
    }

    public void resetFormBusqueda() {
        RequestContext.getCurrentInstance().reset("frmPrincipal:pgFormFilter");
    }

    public static Logger getLogger() {
        return logger;
    }

    public static void setLogger(Logger logger) {
        GuiaRemisionMBean.logger = logger;
    }

    public GuiaRemisionManager getManager() {
        return manager;
    }

    public void setManager(GuiaRemisionManager manager) {
        this.manager = manager;
    }

    public BitacoraManager getBitacoraManager() {
        return bitacoraManager;
    }

    public void setBitacoraManager(BitacoraManager bitacoraManager) {
        this.bitacoraManager = bitacoraManager;
    }

    public RecursosManager getRecursosManager() {
        return recursosManager;
    }

    public void setRecursosManager(RecursosManager recursosManager) {
        this.recursosManager = recursosManager;
    }

    public ApplicationMBean getApplicationMBean() {
        return applicationMBean;
    }

    public void setApplicationMBean(ApplicationMBean applicationMBean) {
        this.applicationMBean = applicationMBean;
    }

    public SessionMBean getSessionMBean() {
        return sessionMBean;
    }

    public void setSessionMBean(SessionMBean sessionMBean) {
        this.sessionMBean = sessionMBean;
    }

    public List<GuiaRemisionDto> getLista() {
        return lista;
    }

    public void setLista(List<GuiaRemisionDto> lista) {
        this.lista = lista;
    }

    public GuiaRemisionDto getDto() {
        return dto;
    }

    public void setDto(GuiaRemisionDto dto) {
        this.dto = dto;
    }

    public GuiaRemisionDto getDtoFiltro() {
        return dtoFiltro;
    }

    public void setDtoFiltro(GuiaRemisionDto dtoFiltro) {
        this.dtoFiltro = dtoFiltro;
    }

    public String getKeyEntidad() {
        return keyEntidad;
    }

    public void setKeyEntidad(String keyEntidad) {
        this.keyEntidad = keyEntidad;
    }

    public String getTituloDetalle() {
        return tituloDetalle;
    }

    public void setTituloDetalle(String tituloDetalle) {
        this.tituloDetalle = tituloDetalle;
    }

    public GuiaRemisionDetaDto getDetaDto() {
        return detaDto;
    }

    public void setDetaDto(GuiaRemisionDetaDto detaDto) {
        this.detaDto = detaDto;
    }

    public Date getFechaActual() {
        return UtilCore.Fecha.obtenerFechaActualDate();
    }

    public void setFechaActual(Date fechaActual) {
        this.fechaActual = fechaActual;
    }

    public boolean isAccesoAnulada() {
        return accesoAnulada;
    }

    public void setAccesoAnulada(boolean accesoAnulada) {
        this.accesoAnulada = accesoAnulada;
    }

    public boolean isAccesoConfirmada() {
        return accesoConfirmada;
    }

    public void setAccesoConfirmada(boolean accesoConfirmada) {
        this.accesoConfirmada = accesoConfirmada;
    }

    public boolean isAccesoGuardar() {
        return accesoGuardar;
    }

    public void setAccesoGuardar(boolean accesoGuardar) {
        this.accesoGuardar = accesoGuardar;
    }

    public List<AlmacenDto> getListaAlmacenes() throws DAOException {
        AlmacenManager almacenManager = (AlmacenManager) WebServletContextListener.getApplicationContext().getBean("almacenManager");
        listaAlmacenes = almacenManager.obtenerAlmacenesActivosPorOrganizacion();
        return listaAlmacenes;
    }

    public void setListaAlmacenes(List<AlmacenDto> listaAlmacenes) {
        this.listaAlmacenes = listaAlmacenes;
    }

    public Integer getContIndex() {
        return contIndex;
    }

    public void setContIndex(Integer contIndex) {
        this.contIndex = contIndex;
    }

    public SelectItem[] getSiEstadosFiltro() {
        return manager.siEstadosGuiaRemisionTodos();
    }

    public void setSiEstadosFiltro(SelectItem[] siEstadosFiltro) {
        this.siEstadosFiltro = siEstadosFiltro;
    }

    public PedidoCompraDto getDtoPC() {
        return dtoPC;
    }

    public void setDtoPC(PedidoCompraDto dtoPC) {
        this.dtoPC = dtoPC;
    }

    public PedidoVentaDto getDtoPV() {
        return dtoPV;
    }

    public void setDtoPV(PedidoVentaDto dtoPV) {
        this.dtoPV = dtoPV;
    }

    public DocumentoCompraDto getDtoDC() {
        return dtoDC;
    }

    public void setDtoDC(DocumentoCompraDto dtoDC) {
        this.dtoDC = dtoDC;
    }

    public DocumentoVentaDto getDtoDV() {
        return dtoDV;
    }

    public void setDtoDV(DocumentoVentaDto dtoDV) {
        this.dtoDV = dtoDV;
    }

    public SelectItem[] getSiTipos() {
        return manager.siTipos();
    }

    public void setSiTipos(SelectItem[] siTipos) {
        this.siTipos = siTipos;
    }

    public SelectItem[] getSiTiposFiltro() {
        return manager.siTiposTodos();
    }

    public void setSiTiposFiltro(SelectItem[] siTiposFiltro) {
        this.siTiposFiltro = siTiposFiltro;
    }

    public List<AlmacenUbicacionDto> getListaAlmacenesUbicacionOrigen() {
        return listaAlmacenesUbicacionOrigen;
    }

    public void setListaAlmacenesUbicacionOrigen(List<AlmacenUbicacionDto> listaAlmacenesUbicacionOrigen) {
        this.listaAlmacenesUbicacionOrigen = listaAlmacenesUbicacionOrigen;
    }

    public List<AlmacenUbicacionDto> getListaAlmacenesUbicacionDestino() {
        return listaAlmacenesUbicacionDestino;
    }

    public void setListaAlmacenesUbicacionDestino(List<AlmacenUbicacionDto> listaAlmacenesUbicacionDestino) {
        this.listaAlmacenesUbicacionDestino = listaAlmacenesUbicacionDestino;
    }

    public GrDetaItemDto getGrDetaItemDto() {
        return grDetaItemDto;
    }

    public void setGrDetaItemDto(GrDetaItemDto grDetaItemDto) {
        this.grDetaItemDto = grDetaItemDto;
    }

    public GuiaRemisionDto getInfoGrDto() {
        return infoGrDto;
    }

    public void setInfoGrDto(GuiaRemisionDto infoGrDto) {
        this.infoGrDto = infoGrDto;
    }

    public GuiaRemisionDto[] getSelectedGRs() {
        return selectedGRs;
    }

    public void setSelectedGRs(GuiaRemisionDto[] selectedGRs) {
        this.selectedGRs = selectedGRs;
    }

    public ExportarExcelInve.GuiaRemision getGrExcel() {
        return grExcel;
    }

    public void setGrExcel(ExportarExcelInve.GuiaRemision grExcel) {
        this.grExcel = grExcel;
    }

    public Boolean getCheckExcel() {
        return checkExcel;
    }

    public void setCheckExcel(Boolean checkExcel) {
        this.checkExcel = checkExcel;
    }

    public List<ParametroDto> getListaMotivosSinOrigen() {
        return this.recursosManager.obtenerParametrosActivosPorCatalogoSistema(this.manager.getIdCatalogoMotivosSinOrigen());
    }

    public void setListaMotivosSinOrigen(List<ParametroDto> listaMotivosSinOrigen) {
        this.listaMotivosSinOrigen = listaMotivosSinOrigen;
    }

    public List<ParametroDto> getListaMotivosConOrigen() {
        return this.recursosManager.obtenerParametrosActivosPorCatalogoSistema(this.manager.getIdCatalogoMotivosConOrigen());
    }

    public void setListaMotivosConOrigen(List<ParametroDto> listaMotivosConOrigen) {
        this.listaMotivosConOrigen = listaMotivosConOrigen;
    }

    public List<ParametroDto> getListaMotivosTransfEntreAlm() {
        return this.recursosManager.obtenerParametrosActivosPorCatalogoSistema(this.manager.getIdCatalogoMotivosTranfEntreAlm());
    }

    public void setListaMotivosTransfEntreAlm(List<ParametroDto> listaMotivosTransfEntreAlm) {
        this.listaMotivosTransfEntreAlm = listaMotivosTransfEntreAlm;
    }

    
    public GuiaRemisionDetaDto getInfoGrDetaDto() {
        return infoGrDetaDto;
    }

    public void setInfoGrDetaDto(GuiaRemisionDetaDto infoGrDetaDto) {
        this.infoGrDetaDto = infoGrDetaDto;
    }
}
